package com.wanghua.spring.interceptor.xml;

import com.wanghua.spring.bean.entity.VisitDetail;
import com.wanghua.spring.service.IAopService;
import org.springframework.aop.MethodBeforeAdvice;
import java.lang.reflect.Method;

//前置通知（Spring）
public class MethodBeforeInterceptor implements MethodBeforeAdvice {
    @Override
    public void before(Method method, Object[] args, Object instance) throws Throwable {
        String type = (String) args[0];
        VisitDetail visitDetail = (VisitDetail) args[1];
        System.out.println("即将要执行方法：" + method.getName() + "  第一个参数：" + type);
        if (instance instanceof IAopService) {  //JDK动态代理,必须用接口。在Spring AOP中有两种代理方式，JDK动态代理和CGLIB代理。默认情况下，TargetObject实现了接口时，则采用JDK动态代理，例如，AServiceImpl；反之，采用CGLIB代理，例如，BServiceImpl。强制使用CGLIB代理需要将 <aop:config>的 proxy-target-class属性设为true。这样才能在这里使用具体类，JDK动态代理下必须转成接口，不能用类。
            String name = ((IAopService) instance).getName();
            if (name == null)
                throw new NullPointerException("name属性不能为null");
        }
    }
}
